#ifndef _LIST_H
#define _LIST_H

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//framebuffer相关头文件
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <fcntl.h>

//读键盘相关头文件
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>

//宏定义设置RGB，以便通过设定 r,g,b参数来设置颜色
#define  RGB888(r, g, b)     ((0xff & r) << 16 | (0xff & g) << 8 | (b & 0xff))

struct termios tcsave;
int flsave;

//根据键盘按键的键值进行宏定义
#define UP    0x415b1b
#define DOWN  0x425b1b
#define LEFT  0x445b1b
#define RIGHT 0x435b1b
#define ENTER 0xa
#define ESC   0x1b
#define SPACE 0x20

//食物数据
typedef struct Food
{
    int x;
    int y;
}F;

//蛇的数据
typedef struct Snake
{
    int x;
    int y;
    struct Snake *next;
}S;

//游戏逻辑功能函数
void cre_snake(S**);//初始化蛇
void cre_food(F*, S*);//创建食物,使食物随机生成在身以外的位置
void move(char, S*);//蛇向指定方向走一步
int if_move(char,char);//避免移动中出现直接掉头的情况
void eat(S*, F*);//蛇吃食物，调用l_snake加长蛇，并刷新食物位置
void l_snake(S*);//吃到食物时用来加长蛇的函数

//gameover相关函数
int outside(S*);//判断蛇是否越界
int headisbody(S*);//判断蛇是否碰到自己
void gameover(S*);//通过outside,headisbody判断是否gameover，并执行结束程序的相关处理
//int if_foodinsnake(S*,F*);//原判断食物是否在射身上的函数

//画图函数，将坐标信息对应到屏幕像素位置
void draw_point(unsigned long*,int,int,int,int,int);//在规划好的区域内，根据左边，画一个指定的单元点,以及设定点的颜色
void draw_snake(unsigned long*,S*);//利用draw_point和蛇的数据画蛇
void draw_food(unsigned long*,F*);//利用draw_point和食物数据画食物
void draw_side(unsigned long*);//根据规划好的像素位置画，游戏的边框
void myclear(unsigned long*);//用于清除方框内颜色，以便重新画图

//获取键盘相关函数
int init_keyboard(void);//初始化调用键盘
void recover_keyboard(void);//释放键盘调用
int get_key(void);//获取键值
//根据键值判断键位
int is_up(int);
int is_down(int);
int is_left(int);
int is_right(int);
int is_enter(int);
int is_esc(int);
int is_space(int);

#endif
